import swb.api.com.vo.req.WithdrawRequest;

import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 签名工具类（支持通用的 data + secret 签名生成）
 */
public class SignUtils {
    // 固定密钥（与服务器一致）
    public static final String MD5_SECRET = "swb123!@#";

    /**
     * 通用签名生成方法（按需求新增）
     * @param data 待签名的数据（如 "userId=123&accountId=456&amount=100"）
     * @param secret 密钥（如 "swb123!@#"）
     * @return MD5加密后的签名（小写）
     */
    public static String generateSign(String data, String secret) {
        if (data == null || secret == null) {
            return ""; // 避免空指针
        }
        String signData = data + secret; // 拼接数据和密钥
        return md5Hex(signData); // 调用MD5加密
    }

    /**
     * 提现专用签名生成（复用通用方法，简化调用）
     * @param userId 用户ID
     * @param accountId 账户ID
     * @param amount 提现金额
     * @return 签名
     */
    public static String generateWithdrawSign(Long userId, int accountId, BigDecimal amount) {
        // 1. 构建待签名的数据字符串（按服务器要求的格式）
//        String data = "userId=" + userId
//                + "&accountId=" + accountId
//                + "&amount=" + amount;
        StringBuilder sb = new StringBuilder();
        sb.append("userId=").append(userId)
                .append("&accountId=").append(accountId)
                .append("&amount=").append(amount);
        // 2. 调用通用签名方法（传入数据和固定密钥）
        return generateSign(sb.toString(), MD5_SECRET);
    }

    /**
     * MD5加密（返回小写十六进制字符串，替代 DigestUtils.md5Hex）
     */
    private static String md5Hex(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(input.getBytes());
            StringBuilder hex = new StringBuilder();
            for (byte b : bytes) {
                // 转十六进制，不足两位补0
                String hexStr = Integer.toHexString(b & 0xFF);
                if (hexStr.length() == 1) {
                    hex.append("0");
                }
                hex.append(hexStr);
            }
            return hex.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        }
    }

    public static void main(String[] args) {
        System.out.println(generateWithdrawSign(1L, 1, new BigDecimal(100)));
        WithdrawRequest withdrawRequest = new WithdrawRequest();
        withdrawRequest.setAccountId(1L);
        withdrawRequest.setAmount(new BigDecimal(100));
        System.out.println(validateSignature(1L, withdrawRequest, "111"));
    }

    private static String validateSignature(Long userId, WithdrawRequest request, String sign) {
        // 构造签名字符串
        StringBuilder sb = new StringBuilder();
        sb.append("userId=").append(userId)
                .append("&accountId=").append(request.getAccountId())
                .append("&amount=").append(request.getAmount());

        // 使用密钥进行签名（这里使用简单的MD5示例）
        return generateSign(sb.toString(), MD5_SECRET);
    }
}
